﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using TTGame;
using System;

/*
 * BuffData
 * Buff数据
 *
 * Buff对象从数据中
 *
 *
 * 依赖：
 *
 * ！不写重复代码！
 * @author TTun
 * @date 8/29/2017 5:24:41 PM
 */
namespace TTGameEngine {

public enum BuffType {
    HPBuff,
    PropBuff,
    ShieldBuff,
    AttackDamageBuff,
    ReceiveDamageBuff,
    StateBuff,
}

public enum ValueCalc {
    Add,
    Decrease,
}

public enum AffectSelect {


}

[Serializable]
public class PropChange {
    [Tooltip("人物属性ID。Float属性从50开始")]
    public int propID;
    [Tooltip("固定数值，负数减属性/正数加属性")]
    public float valueChange;
    [Tooltip("百分比数值，如：0.1是10%")]
    public float precentChange;
    [Tooltip("永久增加属性")]
    public bool isEditProp;    //false，临时变化。true，永久变化，会直接修改人物属性。
    //public ValueCalc valueCalc;

    public float GetValueChange(float baseValue = 0, int layer = 1) {
        float valueChangeResult = (valueChange * layer + precentChange * baseValue * layer);
        return valueChangeResult;
    }
}

/// <summary>
/// 数值变化
///
/// 每过段时间(m_duration/changeCount)，变化数值 changeValue*layer/changePrecent*layer
///
/// changeCount = 0,表示不触发
/// changeCount = 1，表示duration后触发一次。
///
/// 假设：buff持续一秒，触发两次（刚上buff不算），则每1/3秒触发一次
/// </summary>
[Serializable]
public class ValueChange {
    [Tooltip("固定数值，负数减血/正数加血")]
    public float valueChange = 0f;
    [Tooltip("百分比数值，如：0.1是10%")]
    public float precentChange = 0f;
    [Tooltip("持续时间内变化次数"), Range(1, 999)]
    public int changeCount = 1;
//    public ValueCalc valueCalc = ValueCalc.Decrease;

    public float GetValueChange(float maxValue = 0, int layer = 1) {
        float valueChangeResult = (valueChange * layer + precentChange * maxValue * layer);
        return valueChangeResult;
    }

    public bool IsAvailable() {
        return precentChange != 0 || valueChange != 0;
    }
}

[Serializable]
public class BaseBuffData {
    public int BuffID;
    [Tooltip("文档描述，不用于游戏逻辑")]
    public string buffName;
    [TextArea, Tooltip("文档描述，不用于游戏逻辑")]
    public string buffDesc;
    [ReadOnly]
    public BuffType m_buffType = BuffType.PropBuff;
    [Tooltip("持续时间")]
    public float m_duration = 0f;
    [Tooltip("0:刷新 1:不处理 >2:可叠加，叠加层数"), Range(0, 999)]
    public int m_maxOverlayLayer;
    public string effectPrefab;
    [Tooltip("Buff效果的位置点")]
    public string effectPos;
    [Tooltip("指定目标类型，默认不填将应用于所有。")]
    public TargetTypeID targetType = new TargetTypeID();

    public int OverLayType;     //优先级类型，同类型之间只能替换，不能重复出现
    public int OverLayPriority; //替换优先级。优先级类型相同时，数字大的可替换数字小的。
//     public List<PropChange> m_propsChange;  //立即生效
//     //public List<PropChange> m_propsChangeDurTime;
//     //public BuffAction action = BuffAction.None;

}


/// <summary>
/// 每秒伤血/加血。
///
/// 目前百分比以总血量为准。
/// 初始伤害不考虑层数，Dot伤害会考虑层数。
///
/// </summary>
[Serializable]
public class HPBuffData : BaseBuffData {
    [Tooltip("初始伤害/加血. 固定数值/HP百分比")]
    public ValueChange m_hpChange = new ValueChange();      //初始加血/伤害
    [Tooltip("持续伤害/加血. 固定数值/HP百分比")]
    public ValueChange m_hpChangeDot = new ValueChange();   //持续加血/伤害

    public HPBuffData() {
        m_buffType = BuffType.HPBuff;
    }
}

[Serializable]
public class PropBuffData : BaseBuffData {
    public List<PropChange> m_propsChange = new List<PropChange>();

    public PropBuffData() {
        m_buffType = BuffType.PropBuff;
    }
}

[Serializable]
public class AttackDamageBuffData : BaseBuffData {
    [Tooltip("影响攻击伤害。固定数值/原伤害百分比（小数），正数增加伤害/负数减少伤害")]
    public ValueChange m_dmgChange = new ValueChange();

    public AttackDamageBuffData() {
        m_buffType = BuffType.AttackDamageBuff;
    }
}

[Serializable]
public class ReciveDamageBuffData : BaseBuffData {
    [Tooltip("影响受到的伤害。固定数值/原伤害百分比（小数），正数增加伤害/负数减少伤害")]
    public ValueChange m_dmgChange = new ValueChange();

    public ReciveDamageBuffData() {
        m_buffType = BuffType.ReceiveDamageBuff;
    }
}

/// <summary>
/// 眩晕等状态
/// </summary>
[Serializable]
public class StateBuffData : BaseBuffData {
    public string m_controlAnim;
    public ControlState m_controlState = ControlState.None;
    //[Tooltip("动画通过加减速与持续时间同步")]
    //public bool m_isSynAnim = true;

    public StateBuffData() {
        m_buffType = BuffType.StateBuff;
    }
}

/// <summary>
/// 护盾类型
/// </summary>
[Serializable]
public class ShieldBuffData : BaseBuffData {
    [Tooltip("护盾固定数值（每层）")]
    public float valueChange;
    [Tooltip("护盾百分比数值，当前最大血量的百分比（每层）")]
    public float precentChange;
    [Tooltip("护盾初始层数。"), Range(1, 999)]
    public int shieldInitLayer;
    [Tooltip("破盾后是否承受多余伤害。填false可用来实现折光")]
    public bool isOverHurt;

    public ShieldBuffData() {
        m_buffType = BuffType.ShieldBuff;
    }
}


}
